package com.flying.io;

import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author 刘鹏飞
 * @ClassName TestFileByteBuffer
 * @Date 2025/2/7 22:20
 * @Created by 刘鹏飞
 * @Description   字节缓冲区
 */
public class TestFileByteBuffer {

    public static void main(String[] args) {

        long start = System.currentTimeMillis();

        copyFile("image/1.png","2.png");

        long end1 = System.currentTimeMillis();

        System.out.println("花费时间: "+(end1-start));
        long start1 = System.currentTimeMillis();

        copyFileBuffer("image/1.png","2.png");

        long end = System.currentTimeMillis();
        System.out.println("花费时间: "+(end-start1));

    }

    // 未使用字节缓冲区
    public static void copyFile(String src,String back){

        try (FileInputStream fis = new FileInputStream(src);
             FileOutputStream fos=new FileOutputStream(back);
        ) {

            int temp=0;
            // temp 赋值为每次读入缓冲区的实际字节长度
            while ((temp=fis.read())!=-1){

                fos.write(temp);

            }

            // 将内存数据写入文件中
            fos.flush();



        } catch (IOException e) {
            e.printStackTrace();
        }




    }






    // 添加字节缓冲区

    /**
     * 通过创建一个指定长度的字节数组作为缓冲区，以此来提高IO流的读写效率。该方式适用于读取较大文件时的缓冲区定义。注意：缓冲区的长度一定是2的整数幂。一般情况下1024长度较为合适。
     * @param src
     * @param back
     */
    public static void copyFileBuffer(String src,String back){


        try (FileInputStream fis = new FileInputStream(src);
             FileOutputStream fos=new FileOutputStream(back);
        ) {

            byte[] buffer=new byte[1024];
            int temp=0;
            // temp 赋值为每次读入缓冲区的实际字节长度
            while ((temp=fis.read(buffer))!=-1){

                // 使用输入流将每次读入缓冲区的字节写入文件中
                fos.write(buffer,0,temp);
            }

            // 将内存数据写入文件中
            fos.flush();

        } catch (IOException e) {
            e.printStackTrace();
        }


    }



}
